Micron Document
ouroboros git

Node / public / modem73interface / files / Modem73Interface.py

Displaying Raw • Download

Modem73Interface.py master (fdf024ed) Text, 25.08 KB

T8b949e# Modem73Interface.py
T8b949e#
T8b949e# A Reticulum CustomInterface for MODEM73.
T8b949e#
T8b949e# Drop this file into ~/.reticulum/interfaces/ and add an entry like:
T8b949e#
T8b949e# [[MODEM73]]
T8b949e# type = Modem73Interface
T8b949e# enabled = yes
T8b949e# target_host = 127.0.0.1
T8b949e# target_port = 8001
T8b949e# control_host = 127.0.0.1
T8b949e# control_port = 8073
T8b949e# # Optional, defaults shown:
T8b949e# # mtu_overhead = 15
T8b949e# # short_frames = auto # Leave this on auto for best performance
T8b949e# # short_mtu = 170

Tff7b72import T7ee787base64
Tff7b72import T7ee787json
Tff7b72import T7ee787socket
Tff7b72import T7ee787struct
Tff7b72import T7ee787threading
Tff7b72import T7ee787time

Tff7b72import T7ee787RNS
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787TCPInterface Tff7b72import Te6edf3TCPClientInterface


Tff7b72class T56d364Modem73InterfaceTb4b4b4(Te6edf3TCPClientInterfaceTb4b4b4)Tb4b4b4:
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff8

Te6edf3DEFAULT_KISS_PORT Tff7b72= T79c0ff8001
Te6edf3DEFAULT_CONTROL_PORT Tff7b72= T79c0ff8073
Te6edf3DEFAULT_MTU_OVERHEAD Tff7b72= T79c0ff15
Te6edf3DEFAULT_BITRATE Tff7b72= T79c0ff400
Te6edf3DEFAULT_SHORT_MTU Tff7b72= T79c0ff170
Te6edf3FRAG_HEADER_SIZE Tff7b72= T79c0ff5

Te6edf3CONTROL_RECONNECT_WAIT Tff7b72= T79c0ff5
Te6edf3CONTROL_CONNECT_TIMEOUT Tff7b72= T79c0ff5

Te6edf3MODEM_OFDM Tff7b72= T79c0ff0
Te6edf3MODEM_MFSK Tff7b72= T79c0ff1
Te6edf3MODEM_ROBUST Tff7b72= T79c0ff2

Te6edf3OFDM_MODULATIONS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBPSKTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffQPSKTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff8PSKTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffQAM16Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM64Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffQAM256Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffQAM1024Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffQAM4096Ta5d6ff"Tb4b4b4]
Te6edf3OFDM_CODE_RATES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff1/2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff2/3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff3/4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff5/6Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1/4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1/2x2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1/4x2Ta5d6ff"Tb4b4b4]

Te6edf3ROBUST_SHORT_OFFSET Tff7b72= T79c0ff5
Te6edf3ROBUST_MODE_MAX Tff7b72= T79c0ff12
Te6edf3ROBUST_SHORT_MODE Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4: T79c0ff5Tb4b4b4, T79c0ff1Tb4b4b4: T79c0ff6Tb4b4b4, T79c0ff2Tb4b4b4: T79c0ff7Tb4b4b4, T79c0ff3Tb4b4b4: T79c0ff8Tb4b4b4, T79c0ff4Tb4b4b4: T79c0ff9Tb4b4b4, T79c0ff10Tb4b4b4: T79c0ff11Tb4b4b4}
Te6edf3ROBUST_BPS Tff7b72= Tb4b4b4[T79c0ff1150Tb4b4b4, T79c0ff585Tb4b4b4, T79c0ff296Tb4b4b4, T79c0ff296Tb4b4b4, T79c0ff149Tb4b4b4, T79c0ff732Tb4b4b4, T79c0ff378Tb4b4b4, T79c0ff194Tb4b4b4, T79c0ff197Tb4b4b4, T79c0ff99Tb4b4b4,
T79c0ff782Tb4b4b4, T79c0ff513Tb4b4b4, T79c0ff474Tb4b4b4]
T8b949e# Timeout-oriented effective bitrates (legacy static table, csma_overhead = no)
Te6edf3ROBUST_TIMEOUT_BPS Tff7b72= Tb4b4b4[T79c0ff295Tb4b4b4, T79c0ff100Tb4b4b4, T79c0ff75Tb4b4b4, T79c0ff75Tb4b4b4, T79c0ff38Tb4b4b4, T79c0ff185Tb4b4b4, T79c0ff95Tb4b4b4, T79c0ff50Tb4b4b4, T79c0ff50Tb4b4b4, T79c0ff25Tb4b4b4,
T79c0ff196Tb4b4b4, T79c0ff128Tb4b4b4, T79c0ff118Tb4b4b4]
Te6edf3MFSK_TIMEOUT_BPS Tff7b72= T79c0ff10

T8b949e# Frame airtimes in seconds, for CSMA-aware effective bitrate
Te6edf3ROBUST_AIRTIME Tff7b72= Tb4b4b4[T79c0ff3.56Tb4b4b4, T79c0ff7.00Tb4b4b4, T79c0ff13.80Tb4b4b4, T79c0ff13.80Tb4b4b4, T79c0ff27.48Tb4b4b4,
T79c0ff1.88Tb4b4b4, T79c0ff3.64Tb4b4b4, T79c0ff7.08Tb4b4b4, T79c0ff7.00Tb4b4b4, T79c0ff13.88Tb4b4b4,
T79c0ff5.24Tb4b4b4, T79c0ff2.68Tb4b4b4, T79c0ff0.54Tb4b4b4]
T8b949e# (short, normal, long) airtime per OFDM modulation family
Te6edf3OFDM_AIRTIME Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffBPSKTa5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff1.64Tb4b4b4, T79c0ff2.73Tb4b4b4, T79c0ff4.92Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQPSKTa5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff1.09Tb4b4b4, T79c0ff2.73Tb4b4b4, T79c0ff4.92Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ff8PSKTa5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff2.05Tb4b4b4, T79c0ff3.55Tb4b4b4, T79c0ff6.56Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM16Ta5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff1.09Tb4b4b4, T79c0ff2.73Tb4b4b4, T79c0ff4.92Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM64Ta5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff2.05Tb4b4b4, T79c0ff3.55Tb4b4b4, T79c0ff6.56Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM256Ta5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff1.64Tb4b4b4, T79c0ff2.73Tb4b4b4, T79c0ff4.92Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM1024Ta5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff2.32Tb4b4b4, T79c0ff4.10Tb4b4b4, T79c0ff4.10Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffQAM4096Ta5d6ff"Tb4b4b4: Tb4b4b4(T79c0ff2.05Tb4b4b4, T79c0ff3.55Tb4b4b4, T79c0ff3.55Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Te6edf3CSMA_KEYUP_S Tff7b72= T79c0ff0.65
Te6edf3CSMA_BURST_GAP_S Tff7b72= T79c0ff0.2
Te6edf3RANKED_SLOT_S Tff7b72= T79c0ff1.5
Te6edf3RANKED_YIELD_BUCKETS Tff7b72= T79c0ff4
Te6edf3RANKED_QUIET_S Tff7b72= T79c0ff1.0
Te6edf3LEAD_TONE_S Tff7b72= T79c0ff0.8
Te6edf3CSMA_THRESHOLD Tff7b72= T79c0ff0
Te6edf3CSMA_SYNC Tff7b72= T79c0ff1
Te6edf3CSMA_RANKED Tff7b72= T79c0ff2
Te6edf3DEFAULT_TIMEOUT_MARGIN Tff7b72= T79c0ff0.35
Te6edf3MIN_CHANNEL_SHARE Tff7b72= T79c0ff0.25

Te6edf3PKT_LINKREQUEST Tff7b72= T79c0ff0x02
Te6edf3PKT_PROOF Tff7b72= T79c0ff0x03
Te6edf3CTX_LRRTT Tff7b72= T79c0ff0xFE
Te6edf3CTX_LRPROOF Tff7b72= T79c0ff0xFF

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Te6edf3c Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)

Te6edf3target_host Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fftarget_hostTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Te6edf3target_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fftarget_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_KISS_PORT
Te6edf3control_host Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffcontrol_hostTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffcontrol_hostTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Te6edf3target_host
Te6edf3control_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffcontrol_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffcontrol_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_CONTROL_PORT
Te6edf3mtu_overhead Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmtu_overheadTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffmtu_overheadTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_MTU_OVERHEAD
Te6edf3bitrate Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffbitrateTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_BITRATE
Te6edf3auto_frag Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffauto_fragmentationTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffauto_fragmentationTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72True
Te6edf3short_frames Tff7b72= Tffa657strTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffshort_framesTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffshort_framesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Ta5d6ff"Ta5d6ffautoTa5d6ff"
Te6edf3short_mtu Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffshort_mtuTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffshort_mtuTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_SHORT_MTU
Te6edf3handshake_x2 Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffhandshake_x2Ta5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffhandshake_x2Ta5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72False
Te6edf3proof_x2 Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffproof_x2Ta5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffproof_x2Ta5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72False
Te6edf3auto_bitrate Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffauto_bitrateTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffauto_bitrateTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72True
Te6edf3csma_overhead Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffcsma_overheadTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffcsma_overheadTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72True
Te6edf3csma Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffcsmaTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffcsmaTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72True
Te6edf3timeout_margin Tff7b72= Tffa657floatTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftimeout_marginTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fftimeout_marginTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_TIMEOUT_MARGIN

Tff7b72if Te6edf3short_frames Tff7b72not Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffoffTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffalwaysTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface: invalid short_frames value Tffea00\"Tffd700{Te6edf3short_framesTffd700}Tffea00\"Ta5d6ff, using Tffea00\"Ta5d6ffoffTffea00\"Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)
Te6edf3short_frames Tff7b72= Ta5d6ff"Ta5d6ffoffTa5d6ff"

Tff7b72selfTff7b72.Td2a8ffcontrol_host Tff7b72= Te6edf3control_host
Tff7b72selfTff7b72.Td2a8ffcontrol_port Tff7b72= Te6edf3control_port
Tff7b72selfTff7b72.Td2a8ffmtu_overhead Tff7b72= Te6edf3mtu_overhead
Tff7b72selfTff7b72.Td2a8ff_fixed_bitrate Tff7b72= Te6edf3bitrate
Tff7b72selfTff7b72.Td2a8ff_auto_frag Tff7b72= Te6edf3auto_frag
Tff7b72selfTff7b72.Td2a8ff_frag_target Tff7b72= Tff7b72None T8b949e# last fragmentation state we asserted
Tff7b72selfTff7b72.Td2a8ff_control_socket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_control_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_control_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_control_stop Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_short_policy Tff7b72= Te6edf3short_frames
Tff7b72selfTff7b72.Td2a8ff_short_mtu Tff7b72= Te6edf3short_mtu
Tff7b72selfTff7b72.Td2a8ff_short_mtu_cfg Tff7b72= Te6edf3short_mtu
Tff7b72selfTff7b72.Td2a8ff_short_oper_mode Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_short_tx_count Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_always_applied Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_handshake_x2 Tff7b72= Te6edf3handshake_x2
Tff7b72selfTff7b72.Td2a8ff_proof_x2 Tff7b72= Te6edf3proof_x2
Tff7b72selfTff7b72.Td2a8ff_auto_bitrate Tff7b72= Te6edf3auto_bitrate
Tff7b72selfTff7b72.Td2a8ff_csma_overhead Tff7b72= Te6edf3csma_overhead
Tff7b72selfTff7b72.Td2a8ff_timeout_margin Tff7b72= Tffa657maxTb4b4b4(T79c0ff0.05Tb4b4b4, Tffa657minTb4b4b4(T79c0ff1.0Tb4b4b4, Te6edf3timeout_marginTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_cfg Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_initial_cfg Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_population Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_occupancy_pct Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_status_interval Tff7b72= T79c0ff30
Tff7b72selfTff7b72.Td2a8ff_last_status_req Tff7b72= T79c0ff0

Tff7b72selfTff7b72.Td2a8ff_csma_default Tff7b72= Te6edf3csma
Tff7b72selfTff7b72.Td2a8ffcsma_enabled Tff7b72= Te6edf3csma
Tff7b72selfTff7b72.Td2a8ffcsma_population Tff7b72= T79c0ff0

Tff7b72selfTff7b72.Td2a8ffr_stat_rssi Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffr_stat_snr Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffr_stat_q Tff7b72= Tff7b72None


Te6edf3initial_mtu Tff7b72= Tff7b72selfTff7b72.Td2a8ff_query_initial_mtuTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3initial_mtu Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3initial_mtu Tff7b72= Tffa657maxTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTb4b4b4, T79c0ff500Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface: could not reach control port at Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Te6edf3control_hostTffd700}Ta5d6ff:Tffd700{Te6edf3control_portTffd700}Ta5d6ff, starting with MTU Tffd700{Te6edf3initial_mtuTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)



Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffkiss_framingTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fftrueTa5d6ff"
Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3target_host
Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3target_portTb4b4b4)
Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3initial_mtuTb4b4b4)

Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3ownerTb4b4b4, Te6edf3cTb4b4b4)

T8b949e# pin our advertisted bitrate
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_fixed_bitrate

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_initial_cfg Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_from_configTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_initial_cfgTb4b4b4)

T8b949e# track config changes
Tff7b72selfTff7b72.Td2a8ff_control_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_control_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_control_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

T8b949e### MTU HELPERS

Tff7b72def Td2a8ff_compute_mtuTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payload_sizeTb4b4b4)Tb4b4b4:
Te6edf3raw Tff7b72= Tffa657intTb4b4b4(Te6edf3payload_sizeTb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffmtu_overhead
Tff7b72return Tffa657maxTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTb4b4b4)

Tff7b72def Td2a8ff_needs_fragmentationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payload_sizeTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4(Tffa657intTb4b4b4(Te6edf3payload_sizeTb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffmtu_overheadTb4b4b4) Tff7b72< Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU

Tff7b72def Td2a8ff_apply_payload_sizeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payload_sizeTb4b4b4)Tb4b4b4:
Te6edf3new_mtu Tff7b72= Tff7b72selfTff7b72.Td2a8ff_compute_mtuTb4b4b4(Te6edf3payload_sizeTb4b4b4)
Tff7b72if Te6edf3new_mtu Tff7b72!= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffHW_MTUTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3old Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffHW_MTUTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3new_mtu
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: payload_size=Tffd700{Te6edf3payload_sizeTffd700}Ta5d6ff, Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffHW_MTU Tffd700{Te6edf3oldTffd700}Ta5d6ff -> Tffd700{Te6edf3new_mtuTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_auto_fragTb4b4b4:
Te6edf3want_frag Tff7b72= Tff7b72selfTff7b72.Td2a8ff_needs_fragmentationTb4b4b4(Te6edf3payload_sizeTb4b4b4)
Tff7b72if Te6edf3want_frag Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_frag_targetTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_set_fragmentationTb4b4b4(Te6edf3want_fragTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_frag_target Tff7b72= Te6edf3want_frag
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: fragmentation Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ffenabledTa5d6ff' Tff7b72if Te6edf3want_frag Tff7b72else Ta5d6ff'Ta5d6ffdisabledTa5d6ff'Tffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(payload_size=Tffd700{Te6edf3payload_sizeTffd700}Ta5d6ff, threshold=Tffd700{Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU Tff7b72+ Tff7b72selfTff7b72.Td2a8ffmtu_overheadTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_set_fragmentationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3enabledTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffset_configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffragmentation_enabledTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3enabledTb4b4b4)Tb4b4b4}
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_control_lockTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_control_socket
Tff7b72if Te6edf3sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: failed to set Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6fffragmentation_enabled=Tffd700{Te6edf3enabledTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72False


Tf0883e@staticmethod
Tff7b72def Td2a8ff_send_cmdTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3objTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3objTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3sockTff7b72.Td2a8ffsendallTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff>ITa5d6ff"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3dataTb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ff_recv_exactTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4:
Te6edf3buf Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72while Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4) Tff7b72< Te6edf3nTb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3sockTff7b72.Td2a8ffrecvTb4b4b4(Te6edf3n Tff7b72- Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3chunkTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3buf Tff7b72+Tff7b72= Te6edf3chunk
Tff7b72return Te6edf3buf

Tf0883e@classmethod
Tff7b72def Td2a8ff_recv_msgTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3sockTb4b4b4)Tb4b4b4:
Te6edf3hdr Tff7b72= Tff7b72clsTff7b72.Td2a8ff_recv_exactTb4b4b4(Te6edf3sockTb4b4b4, T79c0ff4Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3hdrTb4b4b4:
Tff7b72return Tff7b72None
Tb4b4b4(Te6edf3lengthTb4b4b4,Tb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff>ITa5d6ff"Tb4b4b4, Te6edf3hdrTb4b4b4)
Tff7b72if Te6edf3length Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tb4b4b4{Tb4b4b4}
Te6edf3body Tff7b72= Tff7b72clsTff7b72.Td2a8ff_recv_exactTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3lengthTb4b4b4)
Tff7b72if Tff7b72not Te6edf3bodyTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3bodyTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149UnicodeDecodeErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None

Tff7b72def Td2a8ff_query_initial_mtuTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3s Tff7b72= Te6edf3socketTff7b72.Td2a8ffcreate_connectionTb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontrol_hostTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontrol_portTb4b4b4)Tb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffCONTROL_CONNECT_TIMEOUTTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffget_configTa5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3resp Tff7b72= Tff7b72selfTff7b72.Td2a8ff_recv_msgTb4b4b4(Te6edf3sTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3sTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass
Tff7b72if Te6edf3resp Tff7b72and Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff" Tff7b72in Te6edf3respTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_initial_cfg Tff7b72= Te6edf3resp
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_compute_mtuTb4b4b4(Te6edf3respTb4b4b4[Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface: initial control-port query failed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ff_control_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_control_stop Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3s Tff7b72= Te6edf3socketTff7b72.Td2a8ffcreate_connectionTb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontrol_hostTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontrol_portTb4b4b4)Tb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffCONTROL_CONNECT_TIMEOUTTb4b4b4,
Tb4b4b4)
Te6edf3sTff7b72.Td2a8ffsettimeoutTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_status_intervalTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_control_socket Tff7b72= Te6edf3s
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: control port connected Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Tff7b72selfTff7b72.Td2a8ffcontrol_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8ffcontrol_portTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4,
Tb4b4b4)






Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffget_configTa5d6ff"Tb4b4b4}Tb4b4b4)






Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffget_statusTa5d6ff"Tb4b4b4}Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_status_req Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_control_stop Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3msg Tff7b72= Tff7b72selfTff7b72.Td2a8ff_recv_msgTb4b4b4(Te6edf3sTb4b4b4)
Tff7b72except Te6edf3socketTff7b72.Td2a8fftimeoutTb4b4b4:
Te6edf3msg Tff7b72= Tff7b72False
Tff7b72if Te6edf3msg Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72break
Tff7b72if Te6edf3msg Tff7b72is Tff7b72not Tff7b72FalseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_control_msgTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ff_last_status_req Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_status_intervalTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_status_req Tff7b72= Te6edf3now
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_control_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffget_statusTa5d6ff"Tb4b4b4}Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_control_stopTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: control port error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_control_socketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_control_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_control_socket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_always_applied Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_control_stop Tff7b72or Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72break
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffCONTROL_RECONNECT_WAITTb4b4b4)

Tff7b72def Td2a8ff_handle_control_msgTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3msgTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return

T8b949e# config_changed event: { "event": "config_changed", "config": {...} }
Tff7b72if Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffeventTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffconfig_changedTa5d6ff"Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3cfgTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_from_configTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72return

T8b949e# rx_frame event: { "event": "rx_frame", "snr":, "ber_pct":, "level_db": }
Tff7b72if Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffeventTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffrx_frameTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_update_rx_statsTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return

Tff7b72if Ta5d6ff"Ta5d6ffpopulationTa5d6ff" Tff7b72in Te6edf3msg Tff7b72or Ta5d6ff"Ta5d6ffoccupancy_pctTa5d6ff" Tff7b72in Te6edf3msgTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_update_channel_loadTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return

T8b949e# get_config reply: config fields at top level, with "ok": true
Tff7b72if Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff" Tff7b72in Te6edf3msgTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_from_configTb4b4b4(Te6edf3msgTb4b4b4)

Tff7b72def Td2a8ff_update_channel_loadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3changed Tff7b72= Tff7b72False
Te6edf3occ Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffoccupancy_pctTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3occ Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3occ Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657minTb4b4b4(T79c0ff100Tb4b4b4, Tffa657intTb4b4b4(Te6edf3occTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3occ Tff7b72/Tff7b72/ T79c0ff10 Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_occupancy_pct Tff7b72/Tff7b72/ T79c0ff10Tb4b4b4:
Te6edf3changed Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_occupancy_pct Tff7b72= Te6edf3occ
Te6edf3pop Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpopulationTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3pop Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3pop Tff7b72= Tffa657intTb4b4b4(Te6edf3popTb4b4b4)
Tff7b72if Te6edf3pop Tff7b72>Tff7b72= T79c0ff0 Tff7b72and Te6edf3pop Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_populationTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_population Tff7b72= Te6edf3pop
Tff7b72selfTff7b72.Td2a8ffcsma_population Tff7b72= Te6edf3pop
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: channel population Tffd700{Te6edf3popTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffother station(s), occupancy Tffd700{Tff7b72selfTff7b72.Td2a8ff_occupancy_pctTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)
Te6edf3changed Tff7b72= Tff7b72True
Tff7b72if Te6edf3changed Tff7b72and Tff7b72selfTff7b72.Td2a8ff_last_cfg Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_maybe_update_bitrateTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_last_cfgTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: could not update channel load: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_update_rx_statsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3level Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflevel_dbTa5d6ff"Tb4b4b4)
Te6edf3snr Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4)
Te6edf3ber_pct Tff7b72= Te6edf3msgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffber_pctTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3level Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffr_stat_rssi Tff7b72= Tffa657roundTb4b4b4(Tffa657floatTb4b4b4(Te6edf3levelTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3snr Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffr_stat_snr Tff7b72= Tffa657roundTb4b4b4(Tffa657floatTb4b4b4(Te6edf3snrTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3ber_pct Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657floatTb4b4b4(Te6edf3ber_pctTb4b4b4) Tff7b72>Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffr_stat_q Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657minTb4b4b4(T79c0ff100Tb4b4b4, Tffa657roundTb4b4b4(T79c0ff100.0 Tff7b72- Tffa657floatTb4b4b4(Te6edf3ber_pctTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffr_stat_q Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: could not update rx stats: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_sync_from_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_cfg Tff7b72= Te6edf3cfg
Tff7b72selfTff7b72.Td2a8ffcsma_enabled Tff7b72= Tffa657boolTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_enabledTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_csma_defaultTb4b4b4)Tb4b4b4)
Te6edf3mode Tff7b72= Tff7b72selfTff7b72.Td2a8ff_csma_modeTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3mode Tff7b72!= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_csma_mode_seenTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_csma_mode_seen Tff7b72= Te6edf3mode
Te6edf3names Tff7b72= Tb4b4b4{Tff7b72selfTff7b72.Td2a8ffCSMA_THRESHOLDTb4b4b4: Ta5d6ff"Ta5d6ffTHRESHOLDTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffCSMA_SYNCTb4b4b4: Ta5d6ff"Ta5d6ffSYNCTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffCSMA_RANKEDTb4b4b4: Ta5d6ff"Ta5d6ffRANKEDTa5d6ff"Tb4b4b4}
Te6edf3legacy Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_sync_onlyTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None Tff7b72else Ta5d6ff"Ta5d6ff pre 2.3.0Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: CSMA mode Tffd700{Te6edf3namesTb4b4b4[Te6edf3modeTb4b4b4]Tffd700}Tffd700{Te6edf3legacyTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff" Tff7b72in Te6edf3cfgTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_apply_payload_sizeTb4b4b4(Te6edf3cfgTb4b4b4[Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_maybe_update_bitrateTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_update_short_modeTb4b4b4(Te6edf3cfgTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_short_policy Tff7b72== Ta5d6ff"Ta5d6ffalwaysTa5d6ff" Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_always_appliedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_apply_always_shortTb4b4b4(Te6edf3cfgTb4b4b4)

T8b949e### EFFECTIVE BITRATE

Tff7b72def Td2a8ff_phy_profileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Te6edf3mt Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodem_typeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3mt Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_ROBUSTTb4b4b4:
Te6edf3rm Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrobust_modeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3rm Tff7b72is Tff7b72None Tff7b72or Tff7b72not Tb4b4b4(T79c0ff0 Tff7b72<Tff7b72= Te6edf3rm Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffROBUST_MODE_MAXTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffROBUST_BPSTb4b4b4[Te6edf3rmTb4b4b4]Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffROBUST_AIRTIMETb4b4b4[Te6edf3rmTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3mt Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_OFDMTb4b4b4:
Te6edf3airs Tff7b72= Tff7b72selfTff7b72.Td2a8ffOFDM_AIRTIMETff7b72.Td2a8ffgetTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3fs Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffframe_sizeTa5d6ff"Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpayload_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3airs Tff7b72is Tff7b72None Tff7b72or Te6edf3fs Tff7b72is Tff7b72None Tff7b72or Tff7b72not Te6edf3payloadTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3air Tff7b72= Te6edf3airsTb4b4b4[Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657minTb4b4b4(T79c0ff2Tb4b4b4, Tffa657intTb4b4b4(Te6edf3fsTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4]
Tff7b72return Tb4b4b4(Tffa657intTb4b4b4(Te6edf3payloadTb4b4b4) Tff7b72* T79c0ff8 Tff7b72/ Te6edf3airTb4b4b4, Te6edf3airTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ff_csma_modeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Te6edf3sync Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_sync_onlyTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3sync Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffCSMA_THRESHOLD
Tff7b72if Tff7b72not Te6edf3syncTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffCSMA_THRESHOLD
Tff7b72return Tff7b72selfTff7b72.Td2a8ffCSMA_RANKED Tff7b72if Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_rankedTa5d6ff"Tb4b4b4) Tff7b72else Tff7b72selfTff7b72.Td2a8ffCSMA_SYNC

Tff7b72def Td2a8ff_dcd_detect_sTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_fast_floorTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return T79c0ff0.55
Tff7b72return T79c0ff0.78 Tff7b72if Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodem_typeTa5d6ff"Tb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_ROBUST Tff7b72else T79c0ff1.31

Tff7b72def Td2a8ff_csma_per_frame_overheadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4, Te6edf3airtimeTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_enabledTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_csma_defaultTb4b4b4)Tb4b4b4:
Tff7b72return T79c0ff0.0
Te6edf3mode Tff7b72= Tff7b72selfTff7b72.Td2a8ff_csma_modeTb4b4b4(Te6edf3cfgTb4b4b4)
Te6edf3stations Tff7b72= Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_population Tff7b72+ T79c0ff1Tb4b4b4)
Te6edf3slot_ms Tff7b72= Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657intTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffslot_time_msTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff500Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Tff7b72selfTff7b72.Td2a8ffCSMA_RANKEDTb4b4b4:
Te6edf3worst_rank Tff7b72= Tb4b4b4(Te6edf3stations Tff7b72- T79c0ff1Tb4b4b4) Tff7b72+ Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffRANKED_YIELD_BUCKETS Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72return Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffRANKED_QUIET_S Tff7b72+ Te6edf3worst_rank Tff7b72* Tff7b72selfTff7b72.Td2a8ffRANKED_SLOT_S
Tff7b72+ Tff7b72selfTff7b72.Td2a8ffLEAD_TONE_STb4b4b4)

Te6edf3quiet_ms Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_quiet_msTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0
Tff7b72if Te6edf3quiet_ms Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3quiet_ms Tff7b72= Tffa657minTb4b4b4(Tffa657maxTb4b4b4(Te6edf3airtime Tff7b72* T79c0ff250.0Tb4b4b4, T79c0ff300.0Tb4b4b4)Tb4b4b4, T79c0ff3500.0Tb4b4b4)
Te6edf3cw Tff7b72= Tffa657maxTb4b4b4(T79c0ff2Tb4b4b4, Tffa657intTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_cwTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff8Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3mode Tff7b72== Tff7b72selfTff7b72.Td2a8ffCSMA_SYNCTb4b4b4:
Te6edf3det Tff7b72= Tff7b72selfTff7b72.Td2a8ff_dcd_detect_sTb4b4b4(Te6edf3cfgTb4b4b4)
Te6edf3slots Tff7b72= Tffa657minTb4b4b4(T79c0ff16Tb4b4b4, Tffa657maxTb4b4b4(T79c0ff6Tb4b4b4, T79c0ff3 Tff7b72* Te6edf3stationsTb4b4b4)Tb4b4b4)
Te6edf3window Tff7b72= Tffa657maxTb4b4b4(Te6edf3slots Tff7b72* Tb4b4b4(Te6edf3det Tff7b72+ T79c0ff0.15Tb4b4b4)Tb4b4b4,
Te6edf3cw Tff7b72* Te6edf3slot_ms Tff7b72/ T79c0ff500.0Tb4b4b4,
T79c0ff4 Tff7b72* Te6edf3slot_ms Tff7b72/ T79c0ff1000.0Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3window Tff7b72= Te6edf3cw Tff7b72* Te6edf3slot_ms Tff7b72/ T79c0ff1000.0
Tff7b72return Te6edf3quiet_ms Tff7b72/ T79c0ff1000.0 Tff7b72+ Te6edf3window Tff7b72+ Tff7b72selfTff7b72.Td2a8ffCSMA_KEYUP_S

Tff7b72def Td2a8ff_timeout_bitrateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Te6edf3mt Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodem_typeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3mt Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_MFSKTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffMFSK_TIMEOUT_BPS
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_csma_overheadTb4b4b4:
Tff7b72if Te6edf3mt Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_ROBUSTTb4b4b4:
Te6edf3rm Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrobust_modeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3rm Tff7b72is Tff7b72not Tff7b72None Tff7b72and T79c0ff0 Tff7b72<Tff7b72= Te6edf3rm Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffROBUST_MODE_MAXTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffROBUST_TIMEOUT_BPSTb4b4b4[Te6edf3rmTb4b4b4]
Tff7b72return Tff7b72None
Te6edf3prof Tff7b72= Tff7b72selfTff7b72.Td2a8ff_phy_profileTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3prof Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3phyTb4b4b4, Te6edf3air Tff7b72= Te6edf3prof
Te6edf3overhead Tff7b72= Tff7b72selfTff7b72.Td2a8ff_csma_per_frame_overheadTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3airTb4b4b4)
Te6edf3duty Tff7b72= Te6edf3air Tff7b72/ Tb4b4b4(Te6edf3air Tff7b72+ Te6edf3overheadTb4b4b4) Tff7b72if Te6edf3overhead Tff7b72> T79c0ff0 Tff7b72else T79c0ff1.0
Te6edf3share Tff7b72= T79c0ff1.0
Tff7b72if Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcsma_enabledTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_csma_defaultTb4b4b4)Tb4b4b4:
Te6edf3share Tff7b72= Tffa657maxTb4b4b4(T79c0ff1.0 Tff7b72- Tff7b72selfTff7b72.Td2a8ff_occupancy_pct Tff7b72/ T79c0ff100.0Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffMIN_CHANNEL_SHARETb4b4b4)
Tff7b72return Tffa657maxTb4b4b4(T79c0ff8Tb4b4b4, Tffa657intTb4b4b4(Te6edf3phy Tff7b72* Te6edf3duty Tff7b72* Te6edf3shareTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ff_maybe_update_bitrateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_auto_bitrateTb4b4b4:
Tff7b72return
Te6edf3new_bitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_timeout_bitrateTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3new_bitrate Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3new_bitrate Tff7b72!= Tff7b72selfTff7b72.Td2a8ffbitrateTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: bitrate Tffd700{Tff7b72selfTff7b72.Td2a8ffbitrateTffd700}Ta5d6ff -> Ta5d6ff"
Ta5d6fffTa5d6ff"Tffd700{Te6edf3new_bitrateTffd700}Ta5d6ff"
Tff7b72+ Tb4b4b4(Ta5d6ff"Ta5d6ff (CSMA-aware)Ta5d6ff" Tff7b72if Tff7b72selfTff7b72.Td2a8ff_csma_overhead Tff7b72else Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3new_bitrate

T8b949e### SHORT FRAME HANDLING

Tff7b72def Td2a8ff_update_short_modeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Te6edf3modem_type Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodem_typeTa5d6ff"Tb4b4b4)
Te6edf3override Tff7b72= Tff7b72None

Tff7b72if Te6edf3modem_type Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_ROBUSTTb4b4b4:
Te6edf3rm Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrobust_modeTa5d6ff"Tb4b4b4)
Te6edf3short_rm Tff7b72= Tff7b72selfTff7b72.Td2a8ffROBUST_SHORT_MODETff7b72.Td2a8ffgetTb4b4b4(Te6edf3rmTb4b4b4)
Tff7b72if Te6edf3short_rm Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3override Tff7b72= Te6edf3short_rm
Tff7b72selfTff7b72.Td2a8ff_short_mtu Tff7b72= Tffa657minTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_short_mtu_cfgTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffDEFAULT_SHORT_MTU Tff7b72- Tff7b72selfTff7b72.Td2a8ffFRAG_HEADER_SIZETb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_short_mtu Tff7b72= Tff7b72selfTff7b72.Td2a8ff_short_mtu_cfg

Tff7b72elif Te6edf3modem_type Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_OFDMTb4b4b4:
Tff7b72if Tff7b72not Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffshort_frameTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3mod Tff7b72= Tff7b72selfTff7b72.Td2a8ffOFDM_MODULATIONSTff7b72.Td2a8ffindexTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3rate Tff7b72= Tff7b72selfTff7b72.Td2a8ffOFDM_CODE_RATESTff7b72.Td2a8ffindexTb4b4b4(Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcode_rateTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3override Tff7b72= Tb4b4b4(Te6edf3mod Tff7b72<< T79c0ff4Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3rate Tff7b72<< T79c0ff1Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4:
Te6edf3override Tff7b72= Tff7b72None

Tff7b72if Te6edf3override Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_short_oper_modeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_short_oper_mode Tff7b72= Te6edf3override
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_short_policy Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3override Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: short-frame bypass active Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(mode override Tffd700{Te6edf3overrideTffd700}Ta5d6ff, threshold Tffd700{Tff7b72selfTff7b72.Td2a8ff_short_mtuTffd700}Ta5d6ff bytes)Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: short-frame bypass inactive Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6fffor current TNC modeTa5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_apply_always_shortTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cfgTb4b4b4)Tb4b4b4:
Te6edf3modem_type Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodem_typeTa5d6ff"Tb4b4b4)
Te6edf3msg Tff7b72= Tff7b72None

Tff7b72if Te6edf3modem_type Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_ROBUSTTb4b4b4:
Te6edf3rm Tff7b72= Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrobust_modeTa5d6ff"Tb4b4b4)
Te6edf3short_rm Tff7b72= Tff7b72selfTff7b72.Td2a8ffROBUST_SHORT_MODETff7b72.Td2a8ffgetTb4b4b4(Te6edf3rmTb4b4b4)
Tff7b72if Te6edf3short_rm Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffset_configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrobust_modeTa5d6ff"Tb4b4b4: Te6edf3short_rmTb4b4b4}
Tff7b72elif Te6edf3modem_type Tff7b72== Tff7b72selfTff7b72.Td2a8ffMODEM_OFDMTb4b4b4:
Tff7b72if Tff7b72not Te6edf3cfgTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffshort_frameTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffset_configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshort_frameTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}

Tff7b72if Te6edf3msg Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_always_applied Tff7b72= Tff7b72True
Tff7b72return

Tff7b72with Tff7b72selfTff7b72.Td2a8ff_control_lockTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_control_socket
Tff7b72if Te6edf3sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_always_applied Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: switched modem73 to short-frames Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffmode (Tffd700{Te6edf3msgTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: failed to apply Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffshort_frames=always: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_is_handshakeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72< T79c0ff19Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3flags Tff7b72= Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tb4b4b4(Te6edf3flags Tff7b72& T79c0ff0x03Tb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ffPKT_LINKREQUESTTb4b4b4:
Tff7b72return Tff7b72True
Te6edf3ctx_offset Tff7b72= T79c0ff34 Tff7b72if Tb4b4b4(Te6edf3flags Tff7b72>> T79c0ff6Tb4b4b4) Tff7b72& T79c0ff0x01 Tff7b72else T79c0ff18
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72<Tff7b72= Te6edf3ctx_offsetTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Te6edf3dataTb4b4b4[Te6edf3ctx_offsetTb4b4b4] Tff7b72in Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffCTX_LRRTTTb4b4b4, Tff7b72selfTff7b72.Td2a8ffCTX_LRPROOFTb4b4b4)

Tff7b72def Td2a8ff_is_proofTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72< T79c0ff19Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tb4b4b4(Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x03Tb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ffPKT_PROOF

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3copies Tff7b72= T79c0ff1
Tff7b72if Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffifac_identityTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_handshake_x2 Tff7b72and Tff7b72selfTff7b72.Td2a8ff_is_handshakeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3copies Tff7b72= T79c0ff2
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_proof_x2 Tff7b72and Tff7b72selfTff7b72.Td2a8ff_is_proofTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3copies Tff7b72= T79c0ff2

Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(Te6edf3copiesTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_short_policy Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff"
Tff7b72and Tff7b72selfTff7b72.Td2a8ffonline
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_short_oper_mode Tff7b72is Tff7b72not Tff7b72None
Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ff_short_mtu
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_send_short_frameTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72continue
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffprocess_outgoingTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Td2a8ff_send_short_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftxTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffoper_modeTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_short_oper_modeTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_control_lockTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_control_socket
Tff7b72if Te6edf3sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_cmdTb4b4b4(Te6edf3sockTb4b4b4, Te6edf3msgTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff]: short-frame tx failed, Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6fffalling back to KISS: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72False

Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_short_tx_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72return Tff7b72True






Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_control_stop Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_control_socket Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_control_socketTff7b72.Td2a8ffshutdownTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSHUT_RDWRTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_control_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_control_socket Tff7b72= Tff7b72None
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3ip Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6fftarget_ipTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontrol_hostTb4b4b4)
Te6edf3port Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ip Tff7b72and Ta5d6ff"Ta5d6ff:Ta5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3ipTb4b4b4)Tb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Te6edf3ipTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3ipTffd700}Ta5d6ff"
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffModem73Interface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff/Tffd700{Te6edf3ip_strTffd700}Ta5d6ff:Tffd700{Te6edf3portTffd700}Ta5d6ff]Ta5d6ff"


Te6edf3interface_class Tff7b72= Te6edf3Modem73Interface

Served by rngit 1.2.7 - Generated in 0.08s